package com.yugao.fintech.antelope.shop.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yugao.fintech.antelope.shop.assembly.SkuStockInOutRecordAssembly;
import com.yugao.fintech.antelope.shop.manager.SkuStockInOutRecordManager;
import com.yugao.fintech.antelope.shop.mapper.SkuStockInOutRecordMapper;
import com.yugao.fintech.antelope.shop.model.entity.SkuStockInOutRecord;
import com.yugao.fintech.antelope.shop.model.rqrs.sku.SkuStockInOutRecordPageReq;
import com.yugao.fintech.antelope.shop.model.rqrs.sku.SkuStockInOutRecordResp;
import com.yugao.fintech.antelope.shop.model.rqrs.sku.SkuStockInOutRecordSaveReq;
import com.yugao.fintech.antelope.shop.model.rqrs.sku.SkuStockInOutRecordUpdateReq;
import com.yugao.fintech.antelope.shop.service.SkuStockInOutRecordService;
import com.yugao.fintech.framework.mybatisplus.utils.PageUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 出入库存记录
 *

 */
@Slf4j
@Service
public class SkuStockInOutRecordServiceImpl extends ServiceImpl<SkuStockInOutRecordMapper, SkuStockInOutRecord>
    implements IService<SkuStockInOutRecord>, SkuStockInOutRecordService {

    @Autowired
    private SkuStockInOutRecordManager skuStockInOutRecordManager;
    @Autowired
    private SkuStockInOutRecordAssembly skuStockInOutRecordAssembly;
    
    @Override
    public IPage<SkuStockInOutRecordResp> pageRecord(SkuStockInOutRecordPageReq req) {
        LocalDateTime beginTime = req.getBeginLocalDateTime();
        LocalDateTime endTime = req.getEndLocalDateTime();
        LambdaQueryWrapper<SkuStockInOutRecord> lqw = SkuStockInOutRecord.lqw()
            .eq(StringUtils.isNotEmpty(req.getStockNo()), SkuStockInOutRecord::getStockNo, req.getStockNo())
            .eq(StringUtils.isNotEmpty(req.getStatus()), SkuStockInOutRecord::getStatus, req.getStatus())
            .ge(Objects.nonNull(beginTime), SkuStockInOutRecord::getCreatedAt, beginTime)
            .le(Objects.nonNull(endTime), SkuStockInOutRecord::getCreatedAt, endTime)
            .orderByDesc(SkuStockInOutRecord::getCreatedAt);
        IPage<SkuStockInOutRecord> pageData = this.page(PageUtil.to(req), lqw);
        return PageUtil.to(pageData, skuStockInOutRecordAssembly::toSkuStockInOutRecordResp);
    }
    
    @Override
    public List<SkuStockInOutRecordResp> listRecord() {
    	return this.list().stream()
    	        .map(skuStockInOutRecordAssembly::toSkuStockInOutRecordResp).collect(Collectors.toList());
    }

    @Override
    public SkuStockInOutRecordResp getRecord(Long id) {
        SkuStockInOutRecord entity = this.getById(id);
    	return skuStockInOutRecordAssembly.toSkuStockInOutRecordResp(entity);
    }

    @Override
    public boolean saveRecord(SkuStockInOutRecordSaveReq req) {
        SkuStockInOutRecord entity = skuStockInOutRecordAssembly.toSkuStockInOutRecord(req);
    	return this.save(entity);
    }

    @Override
    public boolean updateRecord(SkuStockInOutRecordUpdateReq req) {
        SkuStockInOutRecord entity = skuStockInOutRecordAssembly.toSkuStockInOutRecord(req);
    	return this.updateById(entity);
    }

    @Override
    public boolean deleteRecord(Long id) {
    	return this.removeById(id);
    }
    
    @Override
    public boolean batchDeleteRecord(List<Long> ids) {
    	return this.removeByIds(ids);
    }
}
